﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TipoGenerador;
using NumeroAleatorio;
using System.Collections;
namespace GeneradorNumeroAleatorios
{
   public class Generador
    {
       private static Generador _generador;

       public static Generador getInstancia()
       { 
           if(_generador==null){
               _generador = new Generador();
           }
           return _generador;
       }

       private Generador()
       {
           listNumero = new List<Numero>();
       }

       public virtual double valor_A { get; set; }
       public virtual double? valor_C { get; set; }
       public virtual double valor_M { get; set; }
       private  double valor_N_1 { get; set; }
       public virtual int valor_N { get; set; }
       public virtual double valor_Semilla { get; set; }
       public virtual double valor_T { get; set; }
       private int valorAPorMetodo { get; set; }
       private double valorMPorMetodo { get; set; }


       public virtual EnumTipoGenerador tipoGenerador { get; set; }
       
       private Numero numero { get; set; }
       
       public List<Numero> listNumero { get; set; }

       public List<Numero> GenerarNumeroAleatorio(double? valor_n_1) 
       {

           var cont = 0;
           valor_N_1 = valor_n_1.HasValue==false? valor_Semilla:valor_n_1.Value;
           while (cont!=valor_N)
           {
           cont=cont+1; 
           numero = new Numero();
           numero.NumOrden = valor_N != 1 ? cont : (GetTotalNumeros()+1);
           numero.GenerarNumeroAleatorio(valor_M,valor_A,valor_N_1,valor_C);
           guardarNumero(numero);
           valor_N_1 = numero.Mostrar_Xn_1();
           
           }

           return listNumero;
       }

       private void guardarNumero(Numero numero) 
       {

           listNumero.Add(numero);
       }

       public void ClearLista() 
       {
           listNumero.Clear();
       
       }

       public int GetTotalNumeros()
       {
            return listNumero.Count();
       }

       public Numero GetUltimoNumeroLista() {

           return (Numero)listNumero.LastOrDefault();
       }

       public void AddNumero(Numero n) {

           listNumero.Add(n);
       }
      

       public List<Numero> FormulaRandom(int cantidad) {
           var r=new Random();
           ClearLista();
           for (int i = 0; i < cantidad;i++)
           {

               numero = new Numero();
               numero.NumOrden = i;
               numero.numeroAleatorio = r.NextDouble();
               AddNumero(numero);
           }

           return listNumero;
       }
        #region parametrosAleatorios
       
       public int generarA(int valorArbitrario)
       {
           valorAPorMetodo = (8 * valorArbitrario) + 3;
           return valorAPorMetodo;
       }

       public double generarM()
       {
           valorMPorMetodo = 2e+64;
           return valorMPorMetodo;
       }


        #endregion


    }
}
